#pragma once
#include <QObject>
#include <QUdpSocket>
#include <QMap>
#include <functional>
#include "ConsoleWidget.h"
#include <QShortcut>
/**
 * ConsoleServer: 单例 UDP + 本地 GUI 控制台
 *  - ConsoleServer::instance()->init(9000);
 *  - ConsoleServer::instance()->enableLocalConsole(true);
 *  - ConsoleServer::instance()->registerCommand("echo", "...", [](QStringList args){ return "..."; });
 */
class ConsoleServer : public QObject
{
    Q_OBJECT
public:
    static ConsoleServer* instance();                 // 单例入口（线程安全：C++11 静态局部变量）
    void init(quint16 port = 9000);                   // 初始化 UDP 服务（只会执行一次）
    void enableLocalConsole(bool enabled = true);     // 启用本地 GUI 控制台（Ctrl+` 显示/隐藏）

    // ✅ 新增接口
   void showConsole();
   void hideConsole();
   void toggleConsole();
   void attachShortcut(QWidget *target, const QKeySequence &key = QKeySequence("Ctrl+F12"));
    // 注册命令（可在任意类/任意 cpp 调用）
    void registerCommand(const QString &name, const QString &help,
                         std::function<QString(QStringList)> func);

signals:
    void commandExecuted(const QString &cmd, const QString &result);

private slots:
    void onReadyRead();

private:
    explicit ConsoleServer(QObject *parent = nullptr);
    QUdpSocket *udpSocket = nullptr;
    bool initialized = false;

    struct Command {
        QString help;
        std::function<QString(QStringList)> func;
    };
    QMap<QString, Command> commandMap;

    ConsoleWidget *guiConsole = nullptr;
    QShortcut *shortcut = nullptr; // ✅ 保存当前快捷键
};

// 命令自动注册宏（像 RT-Thread Finsh 的导出一样易用）
// 在任意 .cpp：
//   REGISTER_CMD(echo, "回显", [](QStringList a){ return a.join(' '); });
#define REGISTER_CMD(name, help, func) \
    static bool _##name##_auto_reg = [](){ \
        ConsoleServer::instance()->registerCommand(#name, help, func); \
        return true; \
    }()
